/*----------------------------------------------------------------------------\
|                                XML构造JS                                     |
|-----------------------------------------------------------------------------|
|                   Copyright (c) 2003 Gnct
|                                                                             |
|-----------------------------------------------------------------------------|
|这个JS主要作用是完成表单打包成XML的程序,需要micorsoft的MSXML包的支持                |
|打包格式按照GNCT 的XML文件格式,目前没有定义DTD格式                            |
|调用方法:
|var testXML=new GnctXML();  //建立对象                                        |
|testXML.createFormHeard(formName1,datavoName)  // formName为表单的form名称     |
|//testXML.createFormHeard(formName1,datavoName)  //可以建立多个Form            |
|//加入表单数据                                                                 |
|testXML.appendField(formName1,datavoName,FieldName,FieldValue);               |
|//testXML.appendField(formName2,datavoName,FieldName,FieldValue); //对不同的Form加字段
|alert(testXML.showStr())      //查看当前XML对象
|------------------------------------------------------------------------------|
|需要完善的:
|没有对XML格式进行检测
\----------------------------------------------------------------------------*/


var objDom=null;
//var objRoot=null;
var xmlhttp=null;
var saveFlg=false;
// 创建 ADO-stream 对象
//var ado_stream = new ActiveXObject("ADODB.Stream");
/*
*GnctXML class
*/
function GnctXML()
{

  objDom=new ActiveXObject(getDomDocumentPrefix() + ".DOMDocument");
 //objDom=new ActiveXObject("MSXML.DOMDocument");
  objDom.async=0;
  var xmlstr="<?xml version=\"1.0\" encoding=\"UTF-8\"?><gnct></gnct>";
  objDom.loadXML(xmlstr);
  //objRoot = objDom.createElement("gnct"); //create the root
  //objDom.appendChild(objRoot);
  this.progressText="";
  this.progressFlg="4";
  xmlhttp=new ActiveXObject(getXmlHttpPrefix()+".XmlHttp");
}

/**
* 清除
*/
GnctXML.prototype.clearElement=function ()
{
  objDom.async=0;
  var xmlstr="<?xml version=\"1.0\" encoding=\"UTF-8\"?><gnct></gnct>";
  objDom.loadXML(xmlstr);
}

GnctXML.prototype.getProgressFlg=function()
{
  return this.progressFlg;
}

/*
  '建立form
*/
GnctXML.prototype.createFormHeard = function (formStr)
{
  if(formStr==null || formStr=="")
  {
    alert("Form 名为空");
    return;
  }

  var objForm = objDom.createElement("Form");
  objDom.documentElement.appendChild(objForm);

  curnode=objDom.documentElement.lastChild;
  var namedNodeMap =curnode.attributes;

  var objattID = objDom.createAttribute("Name");
  objattID.text =formStr;
  namedNodeMap.setNamedItem(objattID);
}
/**
* 建立值对象
*/
GnctXML.prototype.CreateValueObject=function (formStr,voName)
{
  var findNode=find_Form(formStr);
  if(findNode==null)
  {
   alert("XML中不存在当前节点");
   return;
  }

  var objTable=objDom.createElement("Table");
  findNode.appendChild(objTable);

  var curnode=findNode.lastChild;
  namedNodeMap =curnode.attributes;

  objattID = objDom.createAttribute("TableName");
  objattID.text =voName;
  namedNodeMap.setNamedItem(objattID);
}

/*
*建立resultSet
*/
GnctXML.prototype.CreateFieldResult=function (fromName,VoName,ID)
{
  var findNode=find_DataByVo(fromName,VoName);
  if(findNode==null)
  {
   alert("XML中不存在当前节点");
   return;
  }
   var objrecord=objDom.createElement("record");
   findNode.appendChild(objrecord);
   var curnode=findNode.lastChild;

   namedNodeMap =curnode.attributes;

  var objattID = objDom.createAttribute("ID");
  objattID.text =ID;
  namedNodeMap.setNamedItem(objattID);
}


/**
* 加入字段域
*/
GnctXML.prototype.appendField = function (formName,dataVOName,ResultID,fieldName,fieldValue)
{
  if(formName==null || formName=="")
  {
    alert("Form名为空");
    return;
  }

 if(dataVOName==null || dataVOName=="")
  {
    alert("voName名为空");
    return;
  }

 if(fieldName==null || fieldName=="")
  {
    alert("fieldName名为空");
    return;
  }

  var findNode=find_DataByResult(formName,dataVOName,ResultID);

  if(findNode==null)
  {
   alert("XML中不存在当前节点");
   return;
  }

   var objField=objDom.createElement("Field");
   objField.text =fieldValue;

   findNode.appendChild(objField);
   var curField=findNode.lastChild;
   namedNodeMap =curField.attributes;
   objattID = objDom.createAttribute("Name");
   objattID.text=fieldName;
   namedNodeMap.setNamedItem(objattID);
}

/**
* 加入字段域1

GnctXML.prototype.appendFile = function (formName,dataVOName,ResultID,fieldName,filePath)
{
  if(formName==null || formName=="")
  {
    alert("Form名为空");
    return;
  }

 if(dataVOName==null || dataVOName=="")
  {
    alert("voName名为空");
    return;
  }

 if(filePath==null || filePath=="")
  {
    alert("filePath名为空");
    return;
  }

  var findNode=find_DataByResult(formName,dataVOName,ResultID);

  if(findNode==null)
  {
   alert("XML中不存在当前节点");
   return;
  }

   var objField=objDom.createElement("Field");
   objField.dataType = "bin.base64";
   // 打开Stream对象，读源文件
  ado_stream.Type = 1; // 1=adTypeBinary
  ado_stream.Open();
  ado_stream.LoadFromFile(filePath);
  // 将文件内容存入XML节点
  objField.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
  ado_stream.Close();

   findNode.appendChild(objField);
   var curField=findNode.lastChild;
   namedNodeMap =curField.attributes;
   objattID = objDom.createAttribute("Name");
   objattID.text=fieldName;
   namedNodeMap.setNamedItem(objattID);
}
*/

/**
* show xml
*/
GnctXML.prototype.showStr=function ()
{
    return objDom.documentElement.xml;
}

GnctXML.prototype.getProgressText=function()
{
  return this.progressText;
}



GnctXML.prototype.setProgressText=function(progressText)
{
  this.progressText=progressText;
  this.onChangeProgressText();
}

GnctXML.prototype.onChangeProgressText=function()
{
}


GnctXML.prototype.resultDispose=function(status,responseText){

  var tmpCitation=this;
  if(status==200){
    var resText=responseText;
    var flg="";
    var text="";
    if(resText.indexOf('#')!=-1)
    {
     flg=resText.substring(0,resText.indexOf('#'));
     text=resText.substring(resText.indexOf('#')+1,resText.length);
    }
    if(flg=='0'){
      saveFlg=true;
    }else{
      saveFlg=false;
    }
    tmpCitation.setProgressText(text);
  }else if(status==404){
    tmpCitation.setProgressText("系统未找找到指定的资源");
    //alert("系统未找找到指定的资源!");
  }else if(status<200){
    tmpCitation.setProgressText("客户端错误");
    //alert("客户端错误:"+xmlhttp.StatusText);
  }else{
    tmpCitation.setProgressText("异常错误,请和管理员联系");
    //alert("异常错误,请和管理员联系!\n"+xmlhttp.StatusText);
  }

}
/**
* send xml data to server
*/

GnctXML.prototype.sendXML=function (action)
{
   var tmpCitation=this;
   saveFlg=false;
   xmlhttp.open("POST",action,true);
   xmlhttp.onreadystatechange=function ()
   {
     var state = xmlhttp.readyState;
     tmpCitation.progressFlg=state;
    if(state==1){
       tmpCitation.setProgressText("文档资料已经装载完毕,正在上传.....");
     }
     if(state==2){
       tmpCitation.setProgressText("正在处理文档资料.....");
     }
     if(state==4){

        tmpCitation.resultDispose(xmlhttp.Status,xmlhttp.responseText);
     }
   }
   xmlhttp.send(objDom);
}

//
GnctXML.prototype.ExceuteCommand=function (action)
{
   xmlhttp.open("get",action,false);
   xmlhttp.send("");
   var status=xmlhttp.Status;
   if(status==200){
    var resText=xmlhttp.responseText;
    var flg="";
    var text="";
    if(resText.indexOf('#')!=-1)
    {
     flg=resText.substring(0,resText.indexOf('#'));
     text=resText.substring(resText.indexOf('#')+1,resText.length);
    }else
    {
      text=resText;
    }
    alert(text);

   }else if(status==404){
     alert("系统未找找到指定的资源!");
   }else if(status<200){
     alert("客户端错误:"+xmlhttp.StatusText);
   }else
   {
     alert("异常错误,请和管理员联系!\n"+xmlhttp.StatusText);
   }
   return status;
}

/**
* 执行命令，返回文本
*/
GnctXML.prototype.ExceuteAction=function (action)
{
   var responseText="";
   xmlhttp.open("get",action,false);
   xmlhttp.send("");
   var status=xmlhttp.Status;
   if(status==200){
     responseText=xmlhttp.responseText;
   }else if(status==404){
     responseText="FF##申请编辑失败，系统未找找到指定的资源";
   }else
   {
     responseText="FF##申请编辑失败，异常错误";
   }

   return responseText;
}

/**
* 查找某个Form
* @return
*/
function find_Form(formName)
{
  var cond;
  cond="//Form[@Name='" +formName+"']";
  var Node=objDom.documentElement.selectSingleNode(cond);
  return Node;
}


/**
* 查找VO
* @return
*/
function find_DataByVo(formName,VOStr)
{
  var cond;
  cond="//Form[@Name='" +formName+"']/Table[@TableName='"+ VOStr +"']";
  var Node=objDom.documentElement.selectSingleNode(cond);
  return Node;
}

/**
* 查找某个节点
* @return
*/
function find_DataByResult(formName,VOStr,ResultID)
{
  var cond;
  cond="//Form[@Name='" +formName+"']/Table[@TableName='"+ VOStr +"']/record[@ID='"+ResultID+"']";
  var Node=objDom.documentElement.selectSingleNode(cond);
  return Node;
}
// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;

	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}

	throw new Error("Could not find an installed XML parser");
}

/**
* 取xmlhttp插件
* @return
*/
function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;

	var prefixes = ["Microsoft", "MSXML", "MSXML2", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}

	throw new Error("Could not find an installed XML parser");
}
